﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SonarSnitch.Business.Entity
{
    public class AvaliacaoProjeto : SonarSnitch.Business.Entity.IAvaliacao 
    {
        public AvaliacaoProjeto(Projeto projeto)
        {
            Projeto = projeto;
        }

        public Projeto Projeto { get; set; }

        /// <summary>
        /// Codigo do Projeto
        /// </summary>
        public string Codigo { get {  return this.Projeto.Codigo; } }

        /// <summary>
        /// Nome do Projeto
        /// </summary>
        public string Nome { get { return this.Projeto.Nome; } }

        /// <summary>
        /// Regional
        /// </summary>
        public string Regional
        {
            get
            {
                var codigo = this.Projeto.FiltrarMetrica("codigo_regional");
                if (codigo != null)
                {
                    switch (codigo.ValorFormatado)
                    {
                        case "1": return "PTEC-SP";
                        case "2": return "PTEC-RJ";
                        case "3": return "PTEC-BA";
                        case "4": return "CPTEC-SEAL";
                        case "5": return "CPTEC-ES";
                        case "6": return "CPTEC-NE";
                        case "7": return "PTEC-BC";
                        default: return string.Empty;
                    }
                }
                else
                {
                    return string.Empty;
                }
            }
        }

        private float ComputarValor(string metrica)
        {
            if (this.Projeto.Intervalos.Count > 0)
            {
                return this.Projeto.FiltrarIntervalo(metrica).Resultado;
            }
            else
            {
                var metricaFiltrada = this.Projeto.FiltrarMetrica(metrica);
                if (metricaFiltrada != null)
                {
                    return metricaFiltrada.Valor;
                }
                else
                {
                    return 0;
                }
            }
        }
        
        /// <summary>
        /// Número de Linhas de Código
        /// </summary>
        public float Linhas { get { return ComputarValor("ncloc"); } }

        /// <summary>
        /// Total Quality
        /// </summary>
        public float Qualidade { get { return ComputarValor("total-quality"); } }
        
        /// <summary>
        /// Rules Complain - RCI
        /// </summary>
        public float ConformidadeRegras { get { return ComputarValor("violations_density"); } }
        
        /// <summary>
        /// Cobertura de Testes - Coverage
        /// </summary>
        public float Cobertura { get { return ComputarValor("coverage"); } }

        /// <summary>
        /// % de sucesso dos testes unitários
        /// </summary>
        public float SucessoTestes { get { return ComputarValor("test_success_density"); } }
        
        /// <summary>
        /// Violações de código (com peso)
        /// </summary>
        public float Violacoes { get { return ComputarValor("weighted_violations"); } }

        /// <summary>
        /// Número de violações Blocker
        /// </summary>
        public float ViolacoesBlockerCritical { get { return this.ViolacoesBlocker + this.ViolacoesCritical; } }

        /// <summary>
        /// Número de violações Blocker
        /// </summary>
        public float ViolacoesBlocker { get { return ComputarValor("blocker_violations"); } }

        /// <summary>
        /// Número de Violacoes Critical
        /// </summary>
        public float ViolacoesCritical { get { return ComputarValor("critical_violations"); } }

        /// <summary>
        /// Duplicação de Código
        /// </summary>
        public float CodigoDuplicado { get { return ComputarValor("duplicated_lines_density"); } }

        /// <summary>
        /// Débito Técnico
        /// </summary>
        public float DebitoTecnico { get { return ComputarValor("technical_debt_ratio"); } }

        /// <summary>
        /// Comentários
        /// </summary>
        public float Comentarios { get { return ComputarValor("comment_lines_density"); } }

        /// <summary>
        /// Arquitetura do Total Quality
        /// </summary>
        public float Arquitetura { get { return ComputarValor("total-quality-architecture"); } }

        /// <summary>
        /// Design do Total Quality
        /// </summary>
        public float Design { get { return ComputarValor("total-quality-design"); } }

        /// <summary>
        /// Total Quality de Testes
        /// </summary>
        public float Testes { get { return ComputarValor("total-quality-test"); } }

        /// <summary>
        /// Total Quality de Código Fonte
        /// </summary>
        public float Fonte { get { return ComputarValor("total-quality-code"); } }

        /// <summary>
        /// Peso
        /// </summary>
        public float Peso 
        { 
            get 
            { 
                if(this.Linhas < 25000) {
                    return 1;
                } else if(this.Linhas < 100000) {
                    return 2;
                } else {
                    return 4;
                }
            }
        }

        /// <summary>
        /// Acesso ao projeto no Sonar
        /// </summary>
        public string UriSonar { get { return string.Format("http://sonar.petrobras.com.br/dashboard/index/{0}", Codigo); } }
    }
}
